import appConfig from 'AppConfig/index';

/*
* fn [function] 需要防抖的函数
* delay [number] 毫秒，防抖期限值
*/
export const _debounce =  function (fn,delay){
    let timer = null //借助闭包
    return function() {
        console.log("123")
        if(timer){
            clearTimeout(timer) //进入该分支语句，说明当前正在一个计时过程中，并且又触发了相同事件。所以要取消当前的计时，重新开始计时
            timer = setTimeout(fn,delay) 
        }else{
            timer = setTimeout(fn,delay) // 进入该分支说明当前并没有在计时，那么就开始一个计时
        }
    }
}
/**
 * 获取当月第一天最后一天
 * @param {*} data 
 * @returns 
 */
export const getPresentMonth = function(data){
    let start = moment(data).add(0,'month').format('YYYY-MM')+'-01';
    let end = moment(start).endOf('month').format("YYYY-MM-DD");
    let present = moment().format('YYYY-MM-DD');
    let title = moment(data).format('YYYY') + '·' + moment(data).format('MM');

    const endDate = moment(end).month(moment(end).month() - 1).endOf('month').format('DD');
    let perData = []
    for(let i=0;i<7;i++){
        perData.push(endDate-i)
    }
    return {
        title:title,
        present:present,
        start:start,
        end:end,
        perData:perData
    }
}

/**
 * 深度拷贝
 * @param {*} data 
 * @returns 
 */
export const depthCopy = function (data){
    return JSON.parse(JSON.stringify(data));
}

/**
 * 特殊字符串检查
 * @param {*} data 
 * @returns 
 */
export const characterJudge = function (data) {
    let t = /[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/;
    return t.test(data);
}
/**
 * 大于1k会自动转换为1k digits是小数点保留位数
 * @param {*} num 
 * @param {*} digits 
 * @returns 
 */
export const numFormat = function(num=0, digits=2) { 
    if( !myIsNaN(num) ) return num;
    var si = [
        { value: 1, symbol: "" },
        { value: 1E3, symbol: "千" },
        { value: 1E4, symbol: "万" }
    ];
    var rx = /\.0+$|(\.[0-9]*[1-9])0+$/;
    var i;
    for (i = si.length - 1; i > 0; i--) {
        if (num >= si[i].value) {
            break;
        }
    }
    return (num / si[i].value).toFixed(digits).replace(rx, "$1") + si[i].symbol;
};
/**
 * true:数值型的，false：非数值型
 * @param {*} value 
 * @returns 
 */
export const myIsNaN = function (value) {
    return typeof value === 'number' && !isNaN(value);
}
/**
 * 过滤html 标签
 * @param {*} html 
 * @returns 
 */
export const stripHtml = function(html) {
    // Remove some tags
    html = html.replace(/<[^>]+>/gim, '');
    // Remove BB code
    html = html.replace(/\[(\w+)[^\]]*](.*?)\[\/\1]/g, '$2 ');
    return html;
}
/**
 * 随机数组
 * @param {*} data 
 * @returns 
 */
export const randomArr = function (data) {
    return data.sort(()=>{
        return Math.random()-0.5;
    });
}
/**
 * 去重
 * @param {*} person 
 * @returns 
 */
export const getReduceArr = function (person){
    let obj = {};
    //设置cur默认类型为数组，并且初始值为空的数组
    return person.reduce((cur, next)=> {
        obj[next.userIdStr] ? "" : obj[next.userIdStr] = true && cur.push(next);
        return cur;
    },[])
}
// 价格
export const formatMoney=function (value){
    value = Number(value)
    if (isNaN(value)) {
        return 0
    }
    value = Number((value / 100).toFixed(2))
    if (Math.abs(value) < 1000) {
        return value
    }
    return String(value).replace(/./g, (c, i, a) => i && c !== '.' && !((a.length - i) % 3) ? ',' + c : c);
}
// 图片资源
export const getOssPath=function (link){
    if( !link ) return '';
    if( link.indexOf('http')==-1 ) {
        link = appConfig.ossPath + link;
    }
    return link
}
// 商品图片
export const getGoodsImgOssPath=function (link){
    link = link||'weapp/static/pages/empty-image-default.png';
    if( link.indexOf('http')==-1 ) {
        link = appConfig.ossPath + link;
    }
    return link
}

/**
 * 判断是不是数组
 * @param {*} o 数组
 */
export const isArray = function(o){
    return Object.prototype.toString.call(o)== '[object Array]';
}

/**
 * 判断是不是空的字符串
 * @param obj
 * @returns {boolean}
 */

export const isEmpty = function (obj) {
    return this.isNull(obj) || obj === '';
};

/**
 * 判断是不是空的或者undefined
 * @param obj
 * @returns {boolean}
 */

export const isNull = function (obj) {
    return obj === null || typeof obj === 'undefined' || obj === undefined;
};

/**
 * 判断是不是手机号
 * @param s
 * @returns {boolean}
 */
export const isMobilePhone = function (s) {
    // let re = /^(((13[0-9]{1})|(15[0-9]{1})|(14[0-9]{1})|(17[0-9]{1})|(18[0-9]{1}))+\d{8})$/;
    let re = /^1\d{10}$/;
    return re.test(s);
};
/**
 * 判断是不是obj
 * @param {*} object 
 * @returns 
 */
export const isObj = function (object){
    return object && typeof (object) == 'object' && Object.prototype.toString.call(object).toLowerCase() == "[object object]";
}
/**
 * 是否手机号码
 * @param {*} mobile 
 * @returns 
 */
export const isMobile = function (mobile){
    return !/^[0-9]*$/.test(mobile)||mobile.length!=11;
}
/**
 * 是否正确邮箱
 * @param {*} email 
 * @returns 
 */
export const isEmail = function (email){
    return !/^([a-zA-Z0-9]+[_|_|\-|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|_|.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,6}$/.test(email);
}
/**
 * 多维数组转一维数组
 * @param {*} arr 
 * @returns 
 */
export const flatten = (arr) => arr.reduce((acc,val) => acc.concat(Array.isArray(val)? flatten(val):val),[]);
/**
 * 获取当前时间
 * @param {*} date 
 * @param {*} type 
 * @returns 
 */
export const formatTime = function(date,type){
    date = date||new Date();
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    const hour = date.getHours()
    const minute = date.getMinutes()
    const second = date.getSeconds()
  
    var formatNumber = n => {
      n = n.toString()
      return n[1] ? n : '0' + n
    }
    if(type==1){
      return [year, month, day].map(formatNumber).join('-')
    }
    return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute, second].map(formatNumber).join(':')
  }
/**
 * 假设给定的字符串为 s，那么该字符串的长度为 len(s)，每个字母转换为大写和小写的另一个字符串长度也为 len(s)。
 * 因此，一共有 2 * len(s) 种情况。
 * @param {*} s 
 * @returns 
 */
export const getAllCaseTransforms = function(s) {
    let result = [];
    function caseTransformHelper(prefix, startIndex) {
        if (prefix.length === s.length) {
            result.push(prefix);
            return;
        }
        let charCode = s.charCodeAt(startIndex);
        if (charCode >= 97 && charCode <= 122) { // 小写字母
            caseTransformHelper(prefix + s.charAt(startIndex).toUpperCase(), startIndex + 1);
        } else if (charCode >= 65 && charCode <= 90) { // 大写字母
            caseTransformHelper(prefix + s.charAt(startIndex).toLowerCase(), startIndex + 1);
        } else {
            caseTransformHelper(prefix + s.charAt(startIndex), startIndex + 1); // 其他字符保持不变
        }
    }
    caseTransformHelper("", 0);
    return result;
}

/**
 * 
 * @param {要分页的数组} array 
 * @param {每页的大小} pageSize 
 * @param {要返回的页码} pageNumber 
 * @returns 
 */
export const paginateArray = function(array, pageSize, pageNumber) {
    return array.slice((pageNumber - 1) * pageSize, pageNumber * pageSize);
}


//中文转拼音
export const chineseToEnglish = function(c){
    var idx = -1;
    var MAP = 'ABCDEFGHJKLMNOPQRSTWXYZ';
    var boundaryChar = '驁簿錯鵽樲鰒餜靃攟鬠纙鞪黁漚曝裠鶸蜶籜鶩鑂韻糳';
    if (!String.prototype.localeCompare) {
        throw Error('String.prototype.localeCompare not supported.');
    }
    if (/[^\u4e00-\u9fa5]/.test(c)) {
        return c;
    }
    for (var i = 0; i < boundaryChar.length; i++) {
        if (boundaryChar[i].localeCompare(c, 'zh-CN-u-co-pinyin') >= 0) {
            idx = i;
            break;
        }
    }
    return MAP[idx];
}
//获取第一个字母
export const getFirstUpperChar = function(str){
    var string = String(str);
    var c = string[0];
    if (/[^\u4e00-\u9fa5]/.test(c)) {
        return c.toUpperCase();
    }
    else {
        return chineseToEnglish(c);
    }
}
// 排序
export const sortFriend=function(list){
    var map = {}
    var c = 'A'.charCodeAt();
    for(; c <= 'Z'.charCodeAt(); c++ ){
        map[String.fromCharCode(c)] = [];
    }
    map['#'] = [];
    var firstCharUpper;
    list.forEach(function(item){
        firstCharUpper = item.head_letter||getFirstUpperChar(item.decrypt_name);
        if (map.hasOwnProperty(firstCharUpper)) {
            map[firstCharUpper].push(item);
        } else {
            map['#'].push(item);
        }
    }); 
    let arr = [] 
    let letter = [];
    let arrKey = Object.keys(map)//.sort() 
    arrKey.map(i=>{
        let _list = map[i].sort(function (a, b) { 
            return a.decrypt_name.localeCompare(b.decrypt_name, 'zh-CN', { numeric: true }); 
        })
        if( _list&&_list.length ){
            letter.push({
                name:i,list:_list
            })
        }
        arr.push(..._list)
    }) 
    return { newList:arr,letter:letter }; 
};

/**
 * 一维转为 二维二维数组
 * @param {*} arr 
 * @param {*} n 
 * @returns 
 */
export const getTwoArr = function(arr,n=2){
    var arr2 = []
    for (var i = 0, j = 0; i < arr.length; i += n) {
        // 初始化数组单个元素为数组
        arr2[j] = []
        for (var k = 0; k < n; k++) {
            if (i + k < arr.length) { arr2[j].push(arr[i + k]) }
        }
        j++
    }
    return arr2
} 

// 页面跳转
export const openWeappLink = function (link) {    
    if( !link ) return;
    // 打开视频号主页
    if( link.indexOf('openChannelsUserProfile')!=-1 ){
        let parameter = link.split('#');
        wx.openChannelsUserProfile({
            finderUserName: parameter[1]||'',
        });
        return;
    }
    // 打开视频号直播
    if( link.indexOf('openChannelsLive')!=-1 ){
        let parameter = link.split('#');
        wx.openChannelsLive({
            finderUserName: parameter[1]||'',
            feedId: parameter[2]||'',
            nonceId: parameter[3]||'',
        });
        return;
    }
    // 打开视频号活动页
    if( link.indexOf('openChannelsEvent')!=-1 ){
        let parameter = link.split('#');
        wx.openChannelsEvent({
            finderUserName: parameter[1]||'',
            eventId: parameter[2]||'',
        });
        return;
    }
    // 打开视频号视频
    if( link.indexOf('openChannelsActivity')!=-1 ){
        let parameter = link.split('#');
        wx.openChannelsActivity({
            finderUserName: parameter[1]||'',
            feedId: parameter[2]||'',
        });
        return;
    }    
    if( link.indexOf("https:")!=-1||link.indexOf("http:")!=-1 ){
        const loginInfo = wx.getStorageSync(appConfig.envVersion+'LoginInfo')||{};
        if( link.indexOf('?')!=-1 ){
            link = link+"&secdata="+(loginInfo.sec||'');
        }else{
            link = link+"?secdata="+(loginInfo.sec||'');
        }
        wx.navigateTo({
            url: '/pages/webview/webview?url='+encodeURIComponent(link),
        });
    }else{
        if( link.indexOf("appid:")!=-1 ){
            let path = link.split("##");
            let _appid = path[0].replace(/appid:/i, "");
            let _path = path[1]||'';
            if( _appid ){
                wx.navigateToMiniProgram({
                    appId: _appid,
                    path: _path,
                });
            }
        }else{
            wx.navigateTo({
                url: link,
            });
        }            
    }  
}